In long-running systems, it is often necessary to upgrade a service or application to incorporate bug fixes, new features, and/or performance enhancements. Traditionally, upgrades involve stopping the service, making the change, and restarting the service as three distinct steps. Because this process takes the service offline or a period of time, the upgrade is not transparent and can disrupt the user.